package club.babyf.nativeai.demo.algorithm;

/**
 * _34_LiveRoomOnlineCount.
 *
 * @author zhanglei.
 * @date 2025/9/21 19:57.
 * @description 直播间在线人数统计.
 * 统计直播间在线人数
 * 输入两个参数
 * 参数1 二维数组[[1,5],[2,7]]
 * [1,5]代表观众A 第1s进入，第5秒离开
 * [2,7]代表观众B 第2s进入，第7秒离开
 * 参数2 一维数组[3,5]
 * 输出参数2时间轴 对应的直播间人数：第3s直播间在线2人，第5s在线1人。
 * 返回人数列表。
 * 输入：[[[1,5],[2,7]], [3,5]]
 * 输出：[2,1]
 * 统计时间 <= 30000
 */
public class _34_LiveRoomOnlineCount {

    public int[] countOnline(int[][] intervals, int[] queries) {
        int maxTime = 30000;
        // 初始化差分数组，大小为 maxTime+2，索引从 0 到 30001，实际使用索引 1 到 30000
        int[] diff = new int[maxTime + 2];

        // 遍历每个观众的时间区间
        for (int[] interval : intervals) {
            int start = interval[0];
            int end = interval[1];
            // 如果进入时间在统计范围内，则在差分数组的 start 位置增加 1
            if (start <= maxTime) {
                diff[start]++;
            }
            // 如果离开时间在统计范围内，则在差分数组的 end 位置减少 1
            // 注意：区间是左闭右开，即在线时间包括 start，但不包括 end
            if (end <= maxTime) {
                diff[end]--;
            }
        }

        // 初始化在线人数数组，大小为 maxTime+1，索引从 0 到 30000，实际使用索引 1 到 30000
        int[] online = new int[maxTime + 1];
        // 计算每个时间点的在线人数（前缀和）
        for (int i = 1; i <= maxTime; i++) {
            online[i] = online[i - 1] + diff[i];
        }

        // 处理查询数组
        int[] result = new int[queries.length];
        for (int i = 0; i < queries.length; i++) {
            int t = queries[i];
            // 如果查询时间点在有效范围内，直接取 online[t]；否则返回 0
            if (t >= 1 && t <= maxTime) {
                result[i] = online[t];
            } else {
                result[i] = 0;
            }
        }

        return result;
    }

    public static void main(String[] args) {
        _34_LiveRoomOnlineCount liveRoomOnlineCount = new _34_LiveRoomOnlineCount();
        int[] interval1 = new int[] {1, 5};
        int[] interval2 = new int[] {2, 7};
        int[][] intervals = new int[][] {interval1, interval2};
        int[] queries = new int[] {3, 5};
        int[] countedOnline = liveRoomOnlineCount.countOnline(intervals, queries);
        for (int i : countedOnline) {
            System.out.print(i + " | ");
        }
    }

}
